package com.tfjybj.itoo.teach.provider.service;

import com.dmsdbj.itoo.tool.base.service.BaseServicePlus;
import com.dmsdbj.itoo.tool.business.ItooResult;
import com.github.pagehelper.PageInfo;
import com.tfjybj.itoo.teach.entity.CourseEntity;
import com.tfjybj.itoo.teach.model.AcademyModel;
import com.tfjybj.itoo.teach.model.CourseModel;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;


/**
 * CourseService接口
 * course表
 *
 * @author 田成荣
 * @version 2.0.0
 * @since 2.0.0 2018-11-08 19:34:10
 */
public interface CourseService extends BaseServicePlus<CourseEntity> {

    //region 模板生成：模糊查询

    /**
     * 根据课程名称模糊查询course
     *
     * @param name     课程名称
     * @param pageNo   页码
     * @param pageSize 页数
     * @return 模糊查询的course
     * @author 田成荣
     * @since 2.0.0 2018-11-08 19:34:10
     */
    PageInfo<CourseModel> queryByLikeName(String name, Integer pageNo, Integer pageSize);
    //endregion

    /* **********************************以下为非模板生成的内容********************************* */

    /**
     * 页面初始化 查询所有课程信息
     *
     * @param pageNo   页码
     * @param pageSize 页数
     * @return 课程信息model集合
     * @author 张家豪
     * @since 2018.11.08 10:34
     */
    PageInfo<CourseModel> queryAllCourseInfo(Integer pageNo, Integer pageSize);

    /**
     * 根据课程名称和代码查询课程信息model
     *
     * @param code    课程代码
     * @param academy 学院id
     * @return 课程信息model
     * @author 张家豪
     * @since 2018.11.16 14:58
     */
    List<CourseModel> findCourseByCodeAndAcademy(String code, String academy);

    /**
     * 根据代码名称学院模糊查询coursemodel
     *
     * @param code    课程代码
     * @param name    课程名称
     * @param academy 学院id
     * @return 课程信息model
     * @author 张家豪
     * @since 2018.11.16 19:25
     */
    List<CourseModel> fuzzyQueryCourse(String code, String name, String academy);

    /**
     * 分页显示-根据代码名称学院模糊查询coursemodel
     *
     * @param code    课程代码
     * @param name    课程名称
     * @param academy 学院id
     * @return 课程信息model
     * @author 张家豪
     * @since 2018.11.16 19:25
     */
    PageInfo<CourseModel> pageFuzzyQueryCourse(String code, String name, String academy, Integer pageNo, Integer pageSize);

    /**
     * 导出-根据代码名称学院模糊查询coursemodel
     *
     * @param response 响应
     * @param code     课程代码
     * @param name     课程名称
     * @param academy  学院id
     * @return 课程信息model
     * @author 张家豪
     * @since 2018.11.16 19:25
     */
    ItooResult fuzzyQueryCourseExport(HttpServletResponse response, String code, String name, String academy);

    /**
     * 根据学院ID查询本学院课程+公选课
     *
     * @param academy 学院ID
     * @return coursemodel
     * @author 张家豪
     * @since 2018.11.17 11:02
     */
    List<CourseModel> queryCourseByacademy(String academy);

    /**
     * 根据学院ID查询非公选课
     *
     * @param academy 学院id
     * @return coursemodel
     * @author 张家豪
     * @since 2018.11.18 11:24
     */
    List<CourseModel> queryNonPubCourseByAcademy(String academy);

    /**
     * 根据学院ID查询公选课
     *
     * @param academy 学院id
     * @return coursemodel
     * @author 张家豪
     * @since 2018.11.18 11:24
     */
    List<CourseModel> queryPubCourseByAcademy(String academy);

    /**
     * 根据id查询课程信息，筛选非公选课
     *
     * @param ids 课程id集合
     * @return coursemodel
     * @author 张家豪
     * @since 2018.11.18 15:21
     */
    List<CourseModel> queryNonPubCourseByIds(List<String> ids);

    /**
     * 根据id查询课程信息，筛选公选课
     *
     * @param ids 课程id集合
     * @return coursemodel
     * @author 张家豪
     * @since 2018.11.18 15:21
     */
    List<CourseModel> queryPubCourseByIds(List<String> ids);

    /**
     * 根据id查询课程信息
     *
     * @param ids 课程id集合
     * @return coursemodel
     * @author 张家豪
     * @since 2018.11.18 15:21
     */
    List<CourseModel> queryCourseByIds(List<String> ids);

    /**
     * 下载模板-导入用
     *
     * @param response 响应
     * @return 下载成功或失败
     * @author 张家豪
     * @since 2018.11.21 09:32
     */
    Boolean downTemplate(HttpServletResponse response);

    /**
     * 查询所有学院数据
     *
     * @return 所有学院和机构信息
     * @author 张家豪
     * @since 2018.11.21 15:43
     */
    List<AcademyModel> queryProfessionOrInstitutionInfo();

    /**
     * 根据code查询课程信息-验证code是否重复
     *
     * @param code 课程代码
     * @return 课程信息
     * @author 张家豪
     * @since 2018.11.22 08:28
     */
    List<CourseModel> findByCode(String code);

    /**
     * 根据name查询课程信息-验证name是否重复
     *
     * @param name 课程名称
     * @return 课程信息
     * @author 张家豪
     * @since 2018.11.22 08:28
     */
    List<CourseModel> findByName(String name);

    /**
     * 验证code是否存在
     *
     * @param code 课程代码
     * @return 存在或者不存在
     * @author 张家豪
     * @since 2018.11.22 08:44
     */
    List<CourseModel> isExistByCode(String code);

    /**
     * 验证name是否存在
     *
     * @param name 课程名称
     * @return 存在或者不存在
     * @author 张家豪
     * @since 2018.11.22 08:44
     */
    List<CourseModel> isExistByName(String name);

    /**
     * 根据课程类型和所属学院查询课程信息（类型必填，学院选填）
     *
     * @param academyId  学院id
     * @param courseType 课程类型
     * @return coursemodel
     * @author 张家豪
     * @since 2018.11.22 14:51
     */
    List<CourseModel> queryCourseByTypeAndAcademy(List<String> courseType, String academyId);

    /**
     * 导入课程信息
     *
     * @param multipartFile 批量导入的文件
     * @param request       请求
     * @param response      响应
     * @return itooresult 批量导入的结果
     * @author 张家豪
     * @since 2018年11月25日11:09:33
     */
    ItooResult importCourse(MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response);

    /**
     * 根据课程名称查询课程信息
     *
     * @param name 课程名称
     * @return courseentity
     * @author 张家豪
     * @since 2018.11.28 14:38
     */
    List<CourseEntity> findCourseByName(String name);

    /**
     * 导出错误数据
     *
     * @param response 响应
     * @param errorListId 为成功导入的分组id
     * @return 课程信息model
     * @author 张家豪
     * @since 2018年11月30日11:32:54
     */
    boolean downErrorList(String errorListId, HttpServletResponse response);

    /**
     * 根据学院ID查询所有课程
     *
     * @param academyId 学院id
     * @return courseModel
     * @author 宋喆
     * @since 2018.12.14 19:48
     */
    List<CourseModel> queryCourseByacademyId(String academyId);

    /**
     * 根据课程id查询课程名称
     *
     * @return 课程表当前学年课程信息
     * @author 杨江涛
     * @since 2.0.0 2018-11-24 15:14:12
     */
    CourseEntity findCourse(String id);

    /**
     * 根据参数模糊查询课程名称返回list类型
     *
     * @param searchInfo 模糊查询条件（课程名称/课程代码）searchInfo
     * @return 根据参数模糊查询课程名称返回list类型
     * @author 杨江涛
     * @since 2.0.0  2018-12-6 14:50:58
     */
    PageInfo<CourseEntity> getCourse(String searchInfo, Integer pageNo, Integer pageSize);

    /**
     * 创建考试查询课程
     * @param userId userId
     * @return List<CourseEntity>
     * @author maying
     * @since 2018-12-8 21:42:00
     */
    List<CourseEntity> inquiryCourse(String semester, String userId);

    /**
     * 课程练习-查询所有属于课程练习的课程
     *
     * @return 是否查询成功
     * @author 贾建清
     * @since 2.0.0 2019-3-24 09:51:24
     */
    List<CourseEntity> queryCourseAll();
}
